import { BaseSocket } from './baseSocket';

/**
 * 曲面功能 SurfProcess
 */
export class SurfProcess extends BaseSocket {
  /**
   * 曲面分割
   * @param params
   * @returns
   */
  async splitByCurve(params: {
    root: string; // 整体网格object id
    curves: string[]; // 分割线dxid
  }) {
    return await this.execCmd({
      c: 'shape.SplitByCurve',
      a: params,
    });
  }

  /**
   * 曲面拟合
   * @param params
   * @returns
   */
  async createSurface(params: {
    patches: string[]; // 分割网格面片dxid
    density: number;
  }) {
    return await this.execCmd({
      c: 'shape.CreateSurface',
      a: params,
    });
  }

  /**
   * 标签合并
   * @param params
   * @returns
   */
  async mergePatch(params: {
    patches: string[]; // 分割网格面片dxid
  }) {
    return await this.execCmd({
      c: 'shape.MergePatch',
      a: params,
    });
  }

  /**
   * 曲面布点
   * @param params
   * @returns
   */
  async placePoints(params: {
    surface: number[]; // 拟合曲面ID
    points: number[]; // 点数据
  }) {
    return await this.execCmd({
      c: 'shape.PlacePoints',
      a: params,
    });
  }

  /**
   * 曲面拉伸
   * @param params
   * @returns
   */
  async extrudeSurf(params: {
    patches: string[]; // 分割网格面片
  }) {
    return await this.execCmd({
      c: 'shape.ExtrudeSurf',
      a: params,
    });
  }

  /**
   * 等厚形变
   * @param params
   * @returns
   */
  async uniformDeform(params: {
    surface: number[]; // 曲面片
    offset: number; // 厚度
  }) {
    return await this.execCmd({
      c: 'shape.UniformDeform',
      a: params,
    });
  }

  /**
   * 曲面拼接
   * @param params
   * @returns
   */
  async montageSurf(params: {
    surface: string[]; // 曲面片
  }) {
    return await this.execCmd({
      c: 'shape.MontageSurf',
      a: params,
    });
  }

  /**
   * 变厚形变
   * @param params
   * @returns
   */
  async deform(params: {
    surface: string; // 拟合曲面ID
    refDir: number[]; // 轴向方向
    refOrigin: number[]; // 轴向方向起点
    refAglDir: number[]; // 0度角方向
    height: number[]; // 截面值
    angles: number[]; // 周向角
    thickness: number[]; // 与周角对应的厚度
  }) {
    return await this.execCmd({
      c: 'shape.Deform',
      a: params,
    });
  }

  /**
   * 新增形变点 输入想增加的形变点的位置，输出截面值和角度值，放入变厚形变的配置表格
   * @param params
   * @returns
   */
  async cylindricalCoord(params: {
    surface: string; // 拟合曲面ID
    points: number[]; // 点坐标
    refDir: number[]; // 轴向方向
    refOrigin: number[]; // 轴向方向起点
    refAglDir: number[]; // 0度角方向
  }): Promise<{
    heights: number[];
    angles: number[];
  }> {
    return await this.execCmd(
      {
        c: 'shape.CylindricalCoord',
        a: params,
      },
      false,
    );
  }

  /**
   * 形变点渲染 用户配置的变厚形变厚度数据表格，希望看到形变点在曲面上的位置。输入截面值和角度，输出曲面上的位置
   * @param params
   * @returns
   */
  async surfacePtsByCoord(params: {
    surface: string; // 拟合曲面ID
    refDir: number[]; // 轴向方向
    refOrigin: number[]; // 轴向方向起点
    refAglDir: number[]; // 0度角方向
    heights: number[]; // 截面值
    angles: number[]; // 周向角
  }): Promise<{
    intersections: boolean[];
    points: number[];
  }> {
    return await this.execCmd(
      {
        c: 'shape.SurfacePtsByCoord',
        a: params,
      },
      false,
    );
  }
}
